#ifndef UTIL_H
#define UTIL_H

#include <QDebug>
#include <QFileInfo>
#include <QFile>
#include <QPixmap>
#include <QIcon>
#include <QPainter>
#include <QPainterPath>

#define TEST_UI

#define TEST_NetWork

// 从文件路径中提供文件名
static inline QString getFileName(const QString& filePath)
{
    QFileInfo fileInfo(filePath);
    return fileInfo.fileName();
}

#define TAG QString("[%1:%2]").arg(getFileName(__FILE__), QString::number(__LINE__))

// 默认情况下，qDebug在输出字符串的时候会自动加上""， 可能有时候会干扰调试信息的可读性
// noquote()是QDebug中的一个成员函数，用于制定在输出时不会自动为字符串添加引号
#define LOG() qDebug().noquote() << TAG

// 读文件: 从指定文件中, 读取所有二进制内容, 遇到一个QByteArray
static inline QByteArray loadFileToByteArray(const QString& path)
{
    QFile file(path);
    bool ok = file.open(QFile::ReadOnly);
    if(!ok){
        LOG() << "文件打开失败!";
        return QByteArray();
    }
    QByteArray contents = file.readAll();
    file.close();
    return contents;
}
// 写文件: 把QByteArray中的内容, 写入到某个指定文件中
static inline void writeByteArrayToFile(const QString& path, const QByteArray& content){
    QFile file(path);
    bool ok = file.open(QFile::WriteOnly);
    if(!ok){
        LOG() << "文件打开失败!";
        return ;
    }
    file.write(content);
    file.flush();
    file.close();
}

static inline QIcon makeIcon(const QByteArray& byteArray) {
    QPixmap pixmap;
    pixmap.loadFromData(byteArray);
    QIcon icon(pixmap);
    return icon;
}

static inline QIcon makeCirclesIcon(const QByteArray& byteArray, int radius) {
    QPixmap pixmap;
    pixmap.loadFromData(byteArray);
    if(pixmap.isNull()) {
        return QIcon();
    }
    // Qt::SmoothTransformation: 平滑的转换算法，缩放之后的图片质量更高，缺陷：可能会牺牲一些速度
    pixmap = pixmap.scaled(radius * 2, radius * 2, Qt::IgnoreAspectRatio, Qt::SmoothTransformation);

    // 将pixmap裁剪成原型的
    // 先要创建绘图设备(画布)--透明
    QPixmap output = QPixmap(pixmap.size());
    output.fill(Qt::transparent);
    QPainter painter(&output);
    painter.setRenderHint(QPainter::Antialiasing);

    // 创建原型裁剪路径
    QPainterPath path;
    path.addEllipse(0,0,radius *2, radius * 2);
    painter.setClipPath(path);
    painter.drawPixmap(0,0, pixmap);

    QIcon icon(output);
    return icon;
}


static QString intToString(int64_t value)
{
    if(value < 10000){
        return QString::number(value);
    }else{
        return QString::asprintf("%.1lf万", value/10000.0);
    }
}

static QString intToString2(int64_t value)
{
    if(value < 10000){
        return QString::number(value);
    }else{
        return QString::asprintf("%.2lfw", value/10000.0);
    }
}

static QString hidePhoneNumber(const QString& phoneNum)
{
    if(phoneNum.length() < 11){
        return phoneNum;
    }

    // 150****5678
    return phoneNum.left(3) + "****" + phoneNum.right(4);
}

#endif // UTIL_H
